<?php

namespace core;

class Router
{
    // 分发请求
    public function dispatch($config){
        // var_dump('路由');
        // 解析URL（假设URL格式：/index.php/controller/action/参数1/值1/...）
        $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
        $uri = trim($uri, '/');

        // 分割 URL 为数组（如：['controller', 'action', 'param1', 'val1']）
        $segments = explode('/',$uri);

        // 默认控制器和方法
        $controllerName = !empty($segments[0]) ? $segments[0] : 'Index';
        // var_dump($segments);
        // exit;
        if($controllerName == 'index.php'){
            $controllerName = !empty($segments[1]) ? $segments[1] : 'Index';
            $actionName = !empty($segments[2]) ? $segments[2] : 'index';
        }else{
            $actionName = !empty($segments[1]) ? $segments[1] : 'index';
        }
        
        $params = array_slice($segments, 2);

        // 生成控制器类名（如：app\controller\User → User 控制器）
        $controllerClass = "app\\controller\\{$controllerName}";

        // 检查控制器是否存在
        if(!class_exists($controllerClass)){
            die("控制器{$controllerClass}不存在");
        }

        // var_dump($controllerClass);
        // 实例化控制器并调用方法
        $controller = new $controllerClass();
        if(!method_exists($controller,$actionName)){
            die("方法{$actionName}不存在");
        }

        // 传递参数并执行方法（使用反射处理依赖注入）?
        $reflection = new \ReflectionMethod($controller, $actionName);
        $args = $this->bindParams($reflection, $params);
        $reflection->invokeArgs($controller, $args);

    }
    // 绑定方法参数（简化版，直接按顺序传参）?
    public function bindParams(\ReflectionMethod $method, $params){
        $args = [];
        // $parmaa = $method->getParamets();
        // var_dump($parmaa);
        // exit;
        foreach($method->getParameters() as $param){
            if(isset($params[$param->name])){
                $args[] = $params[$param->name];
            }elseif($param->isDefaultValueAvailable()){
                $args[] = $param->getDefaultValue();
            }else{
                $args[] = null;
            }
        }
        return $args;
    }
}